iT邦幫忙

2021 iThome 鐵人賽

DAY 10
1
Modern Web

當拉拉肉遇到單元測試,是否能夠擦出命運的火花?系列 第 11

[Day 10] 簡單的單元測試實作(四)-關於程式的問題,一律建議重構

  • 分享至 

  • xImage
  •  

為了要讓程式碼更簡潔、更容易懂、及更容易維護,
我們今天要開始將之前的測試程式重構,(雖然好像才剛開始寫)

我們原本是這樣

public function test_leapyear_check_four()
{
    $response = $this->get('/getLeapYear/4');

    $this->assertSame("閏年", $response->getContent());
}

public function test_leapyear_check_2020()
{
    $response = $this->get('/getLeapYear/2020');

    $this->assertSame("閏年", $response->getContent());
}

現在我們要合併成一個 test_leapyear_check_year 函式,
其中$input是輸入值,$output是輸出值

public function test_leapyear_check_year($input, $output)
{
}

然後我們加上註解,其中dataProvider是PHPUnit提供的方法,
代表我們的資料來源是從input_number這個函式而來

/**
 * @param $input
 * @param $output
 * @dataProvider input_number
 */
public function test_leapyear_check_year($input, $output)
{
}

然後我們新增一個input_number函式

public function input_number()
{
}

這個函式回傳測試資料,
也就是剛才那兩個函式中的輸入和輸出資料

public function input_number()
{
    return [
        ['4', '閏年'],
        ['2020', '閏年'],
    ];
}

然後把原本的測試函式內的內容Copy過來

/**
 * @param $input
 * @param $output
 * @dataProvider input_number
 */
public function test_leapyear_check_year($input, $output)
{
    $response = $this->get('/getLeapYear/4');
    $this->assertSame("閏年", $response->getContent());
}

並且修改輸入和輸出資料

/**
 * @param $input
 * @param $output
 * @dataProvider input_number
 */
public function test_leapyear_check_year($input, $output)
{
    $response = $this->get("/getLeapYear/$input");
    $this->assertSame($output, $response->getContent());
}

然後刪掉原本那兩個程式,
現在我們的PHP檔案的內容變成這樣

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class MyFirstUnitTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_leapyear_return_200()
    {
        $response = $this->get('/getLeapYear/0');

        $response->assertStatus(200);
    }

    /**
     * @param $input
     * @param $output
     * @dataProvider input_number
     */
    public function test_leapyear_check_year($input, $output)
    {
        $response = $this->get("/getLeapYear/$input");
        $this->assertSame($output, $response->getContent());
    }

    public function input_number()
    {
        return [
            ['4', '閏年'],
            ['2020', '閏年'],
        ];
    }
}

再執行一次測試
php vendor/phpunit/phpunit/phpunit tests/Feature/MyFirstUnitTest.php
https://ithelp.ithome.com.tw/upload/images/20210911/20105694SZhI9zCYRK.png

果然是通過了,
這樣我們就完成了基本的重構。


上一篇
[Day 09] 簡單的單元測試實作(三)
下一篇
[Day 11] 簡單的單元測試實作(五)
系列文
當拉拉肉遇到單元測試,是否能夠擦出命運的火花?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言